package pe.gob.foncodes.spp.web.controladores.portafolio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import pe.gob.foncodes.sgp.bs.commons.Constant;
import pe.gob.foncodes.sgp.bs.domain.SubTipoProyecto;
import pe.gob.foncodes.sgp.bs.domain.TipoProyecto;
import pe.gob.foncodes.spp.bs.domain.Focalizacion;
import pe.gob.foncodes.spp.bs.domain.Indicador;
import pe.gob.foncodes.spp.bs.domain.Objetivo;
import pe.gob.foncodes.spp.bs.domain.Parametro;
import pe.gob.foncodes.spp.bs.domain.Portafolio;
import pe.gob.foncodes.spp.bs.services.SppServices;
import pe.gob.foncodes.spp.web.controladores.ControladorMenu;
import pe.gob.foncodes.spp.web.datamodel.SubTipoProyectoDataModel;

@ManagedBean
@ApplicationScoped
public class ControladorPortafolio implements Serializable {

	private static Logger LOGGER = Logger
			.getLogger(ControladorPortafolio.class);

	private static final long serialVersionUID = 1585679810676187421L;

	private Portafolio portafolio;
	private Portafolio portafolioBusqueda;
	private Portafolio portafolioSgp;
	private SubTipoProyecto subTipoProyecto;

	private List<Portafolio> portafolios;
	private List<TipoProyecto> tiposPortafolio;
	private List<Focalizacion> focalizaciones;
	private List<Parametro> estadosPortafolio;
	private List<Parametro> modalidadEjecucionPortafolio;

	private SubTipoProyectoDataModel subTipoProyectoDataModel;

	private List<SubTipoProyecto> subTipoProyectos;
	private Indicador indicador;

	private boolean habilitarModoVista;
	private boolean habilitarBotonGrabar;
	private boolean habilitarBotonEditar;

	@ManagedProperty("#{controladorMenu}")
	private ControladorMenu controladorMenu;

	@ManagedProperty("#{controladorMarcoLogico}")
	private ControladorMarcoLogico controladorMarcoLogico;

	@ManagedProperty("#{sppServices}")
	private SppServices sppServices;

	public ControladorPortafolio() {
		this.portafolio = new Portafolio();
		this.portafolioBusqueda = new Portafolio();
		this.portafolios = new ArrayList<Portafolio>();
		this.tiposPortafolio = new ArrayList<TipoProyecto>();
		this.estadosPortafolio = new ArrayList<Parametro>();
		this.modalidadEjecucionPortafolio = new ArrayList<Parametro>();
		this.indicador = new Indicador();
	}

	@PostConstruct
	public void inicializar() {
		LOGGER.info(" INICIALIZANDO ControladorPortafolio CONTROLADOR ");
		try {
			this.tiposPortafolio = this.sppServices
					.buscarTipoProyectoPorEstadoActivo();
			this.estadosPortafolio = this.sppServices
					.buscarEstadosPortafolioActivos();
			this.modalidadEjecucionPortafolio = this.sppServices
					.buscarModalidadEjecucionPortafolioActivos();
			// this.focalizaciones = this.sppServices.buscarFocalizacion();
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Error al inicializar Controlador Portafolio",
							"Error al inicializar Controlador Portafolio"));
			LOGGER.info(" ERROR INICIALIZANDO ControladorPortafolio CONTROLADOR ");
		}
		LOGGER.info(" INICIALIZANDO ControladorPortafolio CONTROLADOR ");
	}

	public void buscarPortafoliosPorFiltros() {
		portafolios = new ArrayList<Portafolio>();
		portafolios = this.sppServices
				.buscarPortafolioPorIdONOmbreOTipoPortafolio(portafolioBusqueda);
	}

	public void limpiar() {
		portafolioBusqueda = new Portafolio();
		portafolios = new ArrayList<Portafolio>();
	}

	public String nuevoPortafolio() {
		inicializar();
		habilitarModoVista = Boolean.FALSE;
		habilitarBotonGrabar = Boolean.TRUE;
		habilitarBotonEditar = Boolean.FALSE;
		this.portafolio = new Portafolio();
		this.portafolio
				.setEstPortafolio(Constant.COD_ESTADO_APERTURA_PORTAFOLIO);
		this.portafolio.setFecCreacion(new Date());
		return "/paginas/portafolio/portafolio.spp?faces-redirect=true";
	}

	public void buscarPortafoliosCreadosSgp() {
		this.subTipoProyectos = this.sppServices
				.buscarSubTipoProyectoByNidTipoProyectoActivos(this.portafolio
						.getNidTipPortafolio());

		this.portafolioSgp = this.sppServices
				.buscarPortafolioPorId(this.portafolio.getNidTipPortafolio());

		if (this.subTipoProyectos != null && !this.subTipoProyectos.isEmpty()) {
			subTipoProyectoDataModel = new SubTipoProyectoDataModel(
					subTipoProyectos);
			RequestContext.getCurrentInstance().execute(
					"confirmDialogWidgetVar.show()");
		} else {
			this.portafolio.setNidTipPortafolio(this.portafolio
					.getNidTipPortafolio());
			this.portafolio = new Portafolio();
		}
	}

	public void noCargarPortafolioDesdeSgp() {
		this.portafolio = new Portafolio();
	}

	public void cargarPortafolioDesdeSgp() {
		try {
			habilitarModoVista = Boolean.FALSE;
			habilitarBotonGrabar = Boolean.FALSE;
			habilitarBotonEditar = Boolean.TRUE;
			this.subTipoProyecto = this.subTipoProyectos.get(0);
			this.portafolio = new Portafolio();
			this.portafolio.setNidPortafolio(this.subTipoProyecto.getId()
					.getNidSubTipoProyecto());
			this.portafolio.setNidTipPortafolio(this.subTipoProyecto.getId()
					.getNidTipoProyecto());
			this.portafolio.setTxtDescripcion(this.subTipoProyecto
					.getTxtDescripcion());
			this.portafolio.setTxtPortafolio(this.subTipoProyecto
					.getTxtSubTipoProyecto());
			this.portafolio.setTxtSigla(this.subTipoProyecto.getTxtPrefijo());
			this.portafolio.setFecCreacion(new Date());
			this.sppServices.guardarPortafolio(this.portafolio);
			RequestContext.getCurrentInstance().execute(
					"confirmDialogWidgetVar.hide()");
			
			this.controladorMenu = getControladorMenu();
			this.controladorMenu.setTapPortafolio(new Integer(0));
			
		} catch (Exception e) {
			this.portafolio = new Portafolio();
			e.printStackTrace();
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "Mensaje Error",
					"Error al Cargar el Portafolio " + e.getMessage());
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			RequestContext.getCurrentInstance().execute(
					"confirmDialogWidgetVar.hide()");

		}

	}

	public void guardarPortafolio() {
		habilitarModoVista = Boolean.FALSE;
		habilitarBotonGrabar = Boolean.TRUE;
		habilitarBotonEditar = Boolean.FALSE;

		LOGGER.info(" Inicio Guardando Portafolio "
				+ this.portafolio.toString());
		try {
			Long idMax = this.sppServices.buscarMaximoIdPortafolio();
			this.portafolio.setNidPortafolio(idMax);
			this.sppServices.guardarPortafolio(this.portafolio);
			this.controladorMenu = getControladorMenu();
			this.controladorMenu.setTapPortafolio(new Integer(0));
		} catch (Exception e) {
			e.printStackTrace();
		}

		LOGGER.info("Fin Guardando Portafolio " + this.portafolio.toString());
	}

	public void actualizarPortafolio() {
		habilitarModoVista = Boolean.FALSE;
		habilitarBotonGrabar = Boolean.FALSE;
		habilitarBotonEditar = Boolean.TRUE;

		LOGGER.info(" Inicio Actualizando Portafolio "
				+ this.portafolio.toString());
		try {
			this.sppServices.actualizarPortafolio(this.portafolio);
			this.controladorMenu = getControladorMenu();
			this.controladorMenu.setTapPortafolio(new Integer(0));
		} catch (Exception e) {
			e.printStackTrace();
		}

		LOGGER.info(" Fin Actualizando Portafolio "
				+ this.portafolio.toString());
	}

	public String buscarParaMostrar(Long idPortafolio) {
		try {
			habilitarModoVista = Boolean.TRUE;
			habilitarBotonGrabar = Boolean.FALSE;
			habilitarBotonEditar = Boolean.FALSE;
			LOGGER.info("Portafolio ID" + idPortafolio);
			this.controladorMarcoLogico = getControladorMarcoLogico();
			this.portafolio = new Portafolio();
			this.portafolio = this.sppServices
					.buscarPortafolioPorId(idPortafolio);

			this.portafolio.setObjetivos(this.sppServices.buscarObjetivosPorPortafolio(idPortafolio));
			this.controladorMarcoLogico.setPortafolio(portafolio);

			this.controladorMarcoLogico.setObjetivos(this.portafolio.getObjetivos());
			Objetivo objetivoBusqueda=new Objetivo();
			objetivoBusqueda.setPortafolio(portafolio);
			this.controladorMarcoLogico.setObjetivoBusqueda(objetivoBusqueda);
		} catch (Exception e) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "Mensaje Error",
					"Error al Cargar el Portafolio " + e.getMessage());
			RequestContext.getCurrentInstance().showMessageInDialog(message);
		}
		return "/paginas/portafolio/portafolio.xhtml?faces-redirect=true";
	}

	public String cancelar() {
		return "/paginas/portafolio/consultarportafolio.xhtml?faces-redirect=true";
	}

	public String buscarParaActualizar(Long idPortafolio) {
		try {
			habilitarModoVista = Boolean.FALSE;
			habilitarBotonGrabar = Boolean.FALSE;
			habilitarBotonEditar = Boolean.TRUE;
			LOGGER.info("Portafolio ID" + idPortafolio);
			this.controladorMarcoLogico = getControladorMarcoLogico();
			this.portafolio = new Portafolio();
			this.portafolio = this.sppServices
					.buscarPortafolioPorId(idPortafolio);

			this.portafolio.setObjetivos(this.sppServices
					.buscarObjetivosPorPortafolio(idPortafolio));
			this.controladorMarcoLogico.setPortafolio(portafolio);

			this.controladorMarcoLogico.setObjetivos(this.portafolio.getObjetivos());
			Objetivo objetivoBusqueda=new Objetivo();
			objetivoBusqueda.setPortafolio(portafolio);
			this.controladorMarcoLogico.setObjetivoBusqueda(objetivoBusqueda);
		} catch (Exception e) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "Mensaje Error",
					"Error al Cargar el Portafolio " + e.getMessage());
			RequestContext.getCurrentInstance().showMessageInDialog(message);
		}
		return "/paginas/portafolio/portafolio.xhtml?faces-redirect=true";
	}

	public void asignarPortafolio(Portafolio portafolio) {
		this.portafolio = portafolio;
	}

	public Portafolio getPortafolio() {
		return this.portafolio;
	}

	public void setPortafolio(Portafolio portafolio) {
		this.portafolio = portafolio;
	}

	public List<Portafolio> getPortafolios() {
		if (this.portafolios == null)
			this.portafolios = this.sppServices.buscarPortafolios();
		return this.portafolios;
	}

	public void setPortafolios(List<Portafolio> portafolios) {
		this.portafolios = portafolios;
	}

	public SppServices getSppServices() {
		return this.sppServices;
	}

	public void setSppServices(SppServices sppServices) {
		this.sppServices = sppServices;
	}

	public List<Focalizacion> getFocalizaciones() {
		return this.focalizaciones;
	}

	public void setFocalizaciones(List<Focalizacion> focalizaciones) {
		this.focalizaciones = focalizaciones;
	}

	public ControladorMarcoLogico getControladorMarcoLogico() {
		return controladorMarcoLogico;
	}

	public void setControladorMarcoLogico(
			ControladorMarcoLogico controladorMarcoLogico) {
		this.controladorMarcoLogico = controladorMarcoLogico;
	}

	public Indicador getIndicador() {
		return indicador;
	}

	public void setIndicador(Indicador indicador) {
		this.indicador = indicador;
	}

	public Portafolio getPortafolioBusqueda() {
		return portafolioBusqueda;
	}

	public void setPortafolioBusqueda(Portafolio portafolioBusqueda) {
		this.portafolioBusqueda = portafolioBusqueda;
	}

	public List<TipoProyecto> getTiposPortafolio() {
		return tiposPortafolio;
	}

	public void setTiposPortafolio(List<TipoProyecto> tiposPortafolio) {
		this.tiposPortafolio = tiposPortafolio;
	}

	public List<Parametro> getEstadosPortafolio() {
		return estadosPortafolio;
	}

	public void setEstadosPortafolio(List<Parametro> estadosPortafolio) {
		this.estadosPortafolio = estadosPortafolio;
	}

	public List<Parametro> getModalidadEjecucionPortafolio() {
		return modalidadEjecucionPortafolio;
	}

	public void setModalidadEjecucionPortafolio(
			List<Parametro> modalidadEjecucionPortafolio) {
		this.modalidadEjecucionPortafolio = modalidadEjecucionPortafolio;
	}

	public List<SubTipoProyecto> getSubTipoProyectos() {
		return subTipoProyectos;
	}

	public void setSubTipoProyectos(List<SubTipoProyecto> subTipoProyectos) {
		this.subTipoProyectos = subTipoProyectos;
	}

	public SubTipoProyecto getSubTipoProyecto() {
		return subTipoProyecto;
	}

	public void setSubTipoProyecto(SubTipoProyecto subTipoProyecto) {
		this.subTipoProyecto = subTipoProyecto;
	}

	public SubTipoProyectoDataModel getSubTipoProyectoDataModel() {
		return subTipoProyectoDataModel;
	}

	public void setSubTipoProyectoDataModel(
			SubTipoProyectoDataModel subTipoProyectoDataModel) {
		this.subTipoProyectoDataModel = subTipoProyectoDataModel;
	}

	public Portafolio getPortafolioSgp() {
		return portafolioSgp;
	}

	public void setPortafolioSgp(Portafolio portafolioSgp) {
		this.portafolioSgp = portafolioSgp;
	}

	public boolean isHabilitarModoVista() {
		return habilitarModoVista;
	}

	public void setHabilitarModoVista(boolean habilitarModoVista) {
		this.habilitarModoVista = habilitarModoVista;
	}

	public boolean isHabilitarBotonGrabar() {
		return habilitarBotonGrabar;
	}

	public void setHabilitarBotonGrabar(boolean habilitarBotonGrabar) {
		this.habilitarBotonGrabar = habilitarBotonGrabar;
	}

	public boolean isHabilitarBotonEditar() {
		return habilitarBotonEditar;
	}

	public void setHabilitarBotonEditar(boolean habilitarBotonEditar) {
		this.habilitarBotonEditar = habilitarBotonEditar;
	}

	public ControladorMenu getControladorMenu() {
		return controladorMenu;
	}

	public void setControladorMenu(ControladorMenu controladorMenu) {
		this.controladorMenu = controladorMenu;
	}

}